home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy004 / files / articulo.t28 < prev    next >
Encoding:
Text File  |  1997-02-06  |  3.8 KB  |  85 lines

  1. ε                        OPTIMIZACION EN ASSEMBLER (I)π
  2. ε                        -----------------------------π
  3.  
  4.         En esta serie de artículos trataré de enseñaros cosas sobre optimiza-
  5. ción de código y pequeños truquillos que harán que vuestro programa en ensam-
  6. blador gane en velocidad y elegancia.
  7.  
  8. εOPTIMIZACION EN COMPARACIONESπ
  9.  
  10.         En una instrucción de comparación, hay ciertas cosas que tenemos que
  11. tener en cuenta.
  12.  
  13.         Tomemos como ejemplo ΓCMP AX, 2121hπ. Esta instrucción simula una resta
  14. a ΓAXπ de φ2121hπ unidades, modificando las banderas (ya sabéis, si da 0, entonces
  15. el flag ΩZπ se activa; si no hay rebosamiento, es decir, si ΓAXπ esΘ mayorπ que φ2121hπ
  16. entonces se activa el flag ΩAπ o el ΩGπ (de ΩGreaterπ), y si φ2121hπ es mayor que ΓAXπ,
  17. entonces se activa el ΩCπ (ΩCarry Flagπ, que también puede ser tratado como flag
  18. ΩBπ, de ΩBelowπ).
  19.  
  20.         Si queremos comprobar esto, hay diferentes maneras de hacerlo y que
  21. hacen lo mismo que ΓCMP XX, YYYYπ. Por ejemplo:
  22.  
  23.   - Si AX no lo vamos a utilizar después, podemos usar la instrucción ΓXORπ para
  24.    la comprobación, puesto que si hacemos  ΓXOR AX, 2121hπ, si δAXπ es φ2121hπ éste
  25.    se quedará a 0, activándose el flag Z como en ΓCMPπ, y además ΓXORπ es más rá-
  26.    pido que ΓCMPπ. Claro está que aquí no nos habrá de importar si AX está por
  27.    encima o por debajo en caso de que no sea 0.
  28.  
  29.   - En caso de que AX queramos usarlo después, tendremos que usar ΓCMPπ.
  30.  
  31.   - Si tan sólo quisiéramos mirar si AX es 0, hay varias maneras, y la más len-
  32.    ta (en términos de procesador) es ΓCMP AX, 0π. Hay otras maneras más rápidas,
  33.    en concreto todas las de operaciones a nivel de bits. «ΓOR AX, AXπ»,
  34.    «ΓAND AX, AXπ» y «ΓTEST AX, AXπ» encenderán el flag Z si AX es 0, y no en caso
  35.    contrario, dejando además AX intacto.
  36.  
  37.         Y después están las bifurcaciones. Las banderas sólo serán modificadas
  38. por operaciones e instrucciones, y nunca "porque sí", por lo que no debemos te-
  39. mer que se modifiquen si nosotros no hemos puesto nada para ello. Entonces, es-
  40. to nos permite hacer varios saltos condicionales sin necesidad de volver a com-
  41. parar. Quiero decir, que no es preciso que antes de un salto condicional vaya
  42. una instrucción de cambio de banderas, porque estas se conservan. Veamos un
  43. ejemplo:
  44.  
  45.         Esto sería la manera sin optimizar:
  46.  
  47. Γ                        CMP     AX, 2121hπ
  48. Γ                        JZ      Opcion1  π
  49. Γ                        CMP     AX, 2121hπ
  50. Γ                        JB      Opcion2  π
  51. Γ                        CMP     AX, 2121hπ
  52. Γ                        JA      Opcion3  π
  53. Γ                        ...              π
  54.  
  55.         Y esto la manera optimizada:
  56.  
  57. Γ                        CMP     AX, 2121hπ
  58. Γ                        JZ      Opcion1π
  59. Γ                        JA      Opcion2π
  60. Γ                        JB      Opcion3π
  61.  
  62.         La estructuración del código máquina nos permite hacer esto (y encima,
  63. queda muy elegante).
  64.  
  65.         Después, si os miráis la sección de δTécnicas Víricasπ veréis un montón
  66. de ejemplos de optimizaciones de código, porque en un virus se practica esto
  67. hasta la saciedad (aunque más las optimizaciones de tamaño que de velocidad).
  68.  
  69.         Más trucos. Imaginad que queremos saber si δAXπ es el valor φ0FFFFhπ. Más
  70. rápido que hacer ΓCMP AX, 0FFFFhπ es esto:
  71.  
  72.                   Γ      INC     AXπ
  73.                   Γ      JZ      Opcion1π
  74.  
  75.         No es que sea gran cosa, pero gana en velocidad y vistosidad, y da la
  76. impresión de que controlamos el tema (y, de hecho, lo controlamos). Si fuera
  77. comprobar si ΩAX es 1π, pues hacemos ΓDEC AXπ en vez de INC AX.
  78.  
  79.         Bueno, pues en el próximo número más. Empezaremos con optimización de
  80. código normal, porque espero que en comparaciones hayais captado la idea.
  81.  
  82.  
  83.                                                ∞ Líyak el Oscuroπ
  84.  
  85.